home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / GUSI / Examples / GUSIAtlkTest.c next >
C/C++ Source or Header  |  1993-07-18  |  4KB  |  177 lines

  1. /*********************************************************************
  2. File        :    GUSI                -    Grand Unified Socket Interface
  3. File        :    GUSIAtlkTest    -    Test appletalk sockets
  4. Author    :    Matthias Neeracher <neeri@iis.ethz.ch>
  5. Started    :    12Apr92                                Language    :    MPW C
  6.                 17Apr92    MN    Handle SIOW activate/update
  7.                 13May92    MN    Adapted for AppleTalk sockets
  8.                 26Jul92    MN    Rewrote for symbolic adresses and new testing gear.
  9.                 31Jul92    MN    Test select()
  10.                 08Sep92    MN    Factor out more common code
  11.                 14Oct92    MN    Fix usage messages
  12. Last        :    14Oct92
  13. *********************************************************************/
  14.  
  15. #include <GUSI.h>
  16. #include <GUSITest.h>
  17. #include <stdio.h>
  18. #include <fcntl.h>
  19. #include <stdlib.h>
  20. #include <errno.h>
  21. #include <string.h>
  22.  
  23. #include "Events.h"
  24.  
  25. extern int GUSIDefaultSpin(spin_msg, long);
  26.  
  27. sa_constr_atlk    Constr    =    {
  28.     1,
  29.     {
  30.         {
  31.             nil, "\pGUSIAtlkTest"
  32.         },
  33.         {
  34.             nil, ""
  35.         },
  36.         {
  37.             nil, ""
  38.         },
  39.         {
  40.             nil, ""
  41.         }
  42.     }
  43. };
  44.  
  45. void Socket(char, char, const char *)
  46. {
  47.     sock    =    socket(AF_APPLETALK, SOCK_STREAM, 0);
  48.     
  49.     if (sock == -1)    {
  50.         printf("# socket() returned error %s\n", Explain());
  51.         Where();
  52.     }
  53. }
  54.  
  55. void Bind(char ch1, char ch2, const char * cmd)
  56. {
  57.     struct sockaddr_atlk_sym    addr;
  58.     Str63                            obj;
  59.  
  60.     if (sock == -1)    {
  61.         printf("# socket is not open\n");
  62.         Where();
  63.         
  64.         return;
  65.     }
  66.  
  67.     if (sscanf(cmd, "%s", (char *) (obj+1)) == 1) {
  68.         addr.family    =    ATALK_SYMADDR;
  69.         obj[0]    =    strlen((char *) (obj+1));
  70.         NBPSetEntity((Ptr) &addr.name, obj, "\pGUSIAtlkTest", "\p*");
  71.     } else {
  72.         Usage(ch1, ch2);
  73.                 
  74.         return;
  75.     }
  76.  
  77.     if (bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_atlk_sym)))    {
  78.         printf("bind(\"%s\") returned error %s\n", (char *) (obj+1), Explain());
  79.         Where();
  80.     }
  81. }
  82.  
  83. void Accept(char, char, const char *)
  84. {
  85.     int                        len;
  86.     struct sockaddr_atlk    addr;
  87.  
  88.     if (sock == -1)    {
  89.         printf("# socket is not open\n");
  90.         Where();
  91.         
  92.         return;
  93.     }
  94.     if (accsock != -1)    {
  95.         printf("# can't accept more than one connection\n");
  96.         Where();
  97.         
  98.         return;
  99.     }
  100.  
  101.     len    =    sizeof(struct sockaddr_atlk);
  102.     sock    =    accept(accsock = sock, (struct sockaddr *) &addr, &len);
  103.     
  104.     if (sock < 0)    {
  105.         printf("# accept() returned error %s\n", Explain());
  106.         sock        =    accsock;
  107.         accsock    =    -1;
  108.     } else
  109.         printf(
  110.             "# accepted connection from [%d]%d:%d\n", 
  111.             addr.addr.aNet, 
  112.             addr.addr.aNode,
  113.             addr.addr.aSocket);
  114.     
  115.     Where();
  116. }
  117.     
  118. void Connect(char, char, const char * cmd)
  119. {
  120.     int                                len;
  121.     struct sockaddr_atlk_sym    symaddr;
  122.     struct sockaddr_atlk            numaddr;
  123.     Str63                                obj;
  124.  
  125.     if (sock == -1)    {
  126.         printf("# socket is not open\n");
  127.         Where();
  128.         
  129.         return;
  130.     }
  131.  
  132.     if (sscanf(cmd, "%s", (char *) (obj+1)) == 1) {
  133.         symaddr.family    =    ATALK_SYMADDR;
  134.         obj[0]    =    strlen((char *) (obj+1));
  135.         NBPSetEntity((Ptr) &symaddr.name, obj, "\pGUSIAtlkTest", "\p*");
  136.  
  137.         if (connect(sock, (struct sockaddr *) &symaddr, sizeof(struct sockaddr_atlk_sym)))    {
  138.             printf("# connect(\"%s\") returned error %s\n", (char *) (obj+1), Explain());
  139.             Where();
  140.         }
  141.     } else {
  142.         len = sizeof(struct sockaddr_atlk);
  143.         
  144.         if (choose(AF_APPLETALK, 0, "Yeah ?", &Constr, 0, &numaddr, &len))    {
  145.             printf("# choose() returned error %s\n", Explain());
  146.             Where();
  147.             
  148.             return;
  149.         }
  150.  
  151.         if (connect(sock, (struct sockaddr *) &numaddr, len))    {
  152.             printf(
  153.                 "# connect([%d]%d:%d) returned error %s\n", 
  154.                 numaddr.addr.aNet, 
  155.                 numaddr.addr.aNode,
  156.                 numaddr.addr.aSocket,
  157.                 Explain());
  158.             Where();
  159.         }
  160.     }
  161. }    
  162.  
  163. main(int argc, char ** argv)
  164. {
  165.     printf("GUSIAtlkTest        MN 14Oct92\n\n");
  166.  
  167.     COMMAND('s', 's', Socket,  "",                 "Create a stream socket");
  168.     COMMAND('a', 'c', Accept,  "",                 "Accept a connection");
  169.     COMMAND('b', 'd', Bind,      "objectname",     "Bind to address");
  170.     COMMAND('c', 'o', Connect, "[objectname]","Connect to address");
  171.     
  172.     AddSocketCommands();
  173.     
  174.     GUSISetEvents(GUSISIOWEvents);
  175.     RunTest(argc, argv);
  176.     CleanupSockets();
  177. }